R para Ciencia de Datos
Club de Lectura r4ds
Cap 14

2021-03-15 18:53:54 GMT -05:00

Cadenas de caracteres

En (Grolemund and Wickham 2019, Cap 14) aprenderás a:

Elementos básicos

Creación de cadenas de caracteres

string1 <- "Esta es una cadena de caracteres"
string2 <- 'Esta es "otra" cadena'

Caracter de escape en cadenas

string3 <- "\\\nHola cómo estas\tAntes señalo un tab\nPuedo también señalar \\n"
# Para visualizar la cadena de caracteres
writeLines(string3)
## \
## Hola cómo estas  Antes señalo un tab
## Puedo también señalar \n

Elementos básicos

Longitud de cadenas

# todas las funciones de stringr 
# empiezan con str_
str_length(string3)
## [1] 62
#\t no es lo mismo que " "
# por eso tenemos como resultado 54
# y no 52
str_length(string3) - str_count(string = string3, pattern = " ")
## [1] 54

Elementos básicos

Combinar cadenas

str_c("a", "b", "c")
## [1] "abc"
# se puede utilizar el argumento sep para
# separar la combinación de caracteres
str_c("a", "b", "c", sep = ",")
## [1] "a,b,c"
str_c("a", NA, "c")
## [1] NA
# En este parte se puede utilizar el argumento
# collapse dado que los caracteres están
# concatenados
str_replace_na(c("a", NA, "c")) %>% str_c(collapse = ",")
## [1] "a,NA,c"

Elementos básicos

Combinar cadenas

str_c("Letter:", letters, sep = " ")
##  [1] "Letter: a" "Letter: b" "Letter: c" "Letter: d" "Letter: e" "Letter: f"
##  [7] "Letter: g" "Letter: h" "Letter: i" "Letter: j" "Letter: k" "Letter: l"
## [13] "Letter: m" "Letter: n" "Letter: o" "Letter: p" "Letter: q" "Letter: r"
## [19] "Letter: s" "Letter: t" "Letter: u" "Letter: v" "Letter: w" "Letter: x"
## [25] "Letter: y" "Letter: z"

Elementos básicos

Dividir cadenas

animales <- c("abeja", "águila", "araña",
              "ballena", "bisonte", "búfalo",
              "caballo", "camello", "canario") 

str_sub(string = animales, start = 2, end = 4)
## [1] "bej" "gui" "rañ" "all" "iso" "úfa" "aba" "ame" "ana"
str_sub(string = animales, start = 6, end = 8)
## [1] ""   "a"  ""   "na" "te" "o"  "lo" "lo" "io"

Elementos básicos

Locales

Algunas funciones del paquete stringr tienen la opción de locales:

# Tener presente el idioma
# Por ejemplo la lengua turca tiene dos i
str_to_upper(c("i", "ı"))
## [1] "I" "I"
# Se requiere cambiar el locale
# consultar el código de los idiomas en
# https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
str_to_upper(c("i", "ı"), locale = "tr")
## [1] "İ" "I"

Otro ejemplo se da en la ordenación de las cadenas de caracteres

## [1] "arándano" "banana"   "espinaca"
## [1] "arándano" "espinaca" "banana"

Elementos básicos

Patrones, expresiones regulares y coincidencias

Coincidencias básicas

Coincidencias exactas

# solo incluye la primera coincidencia
str_view(string = c("manzana", "banana", "pera"), pattern = "an")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Coincidencias básicas

Uso del metacaracter .

# solo incluye la primera coincidencia
# por ejemplo "zan" en manzana no se incluya 
str_view(string = c("manzana", "banana", "pera"), pattern = ".a.")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Coincidencias básicas

Diferenciación entre el metacaracter . y el caracter .

# solo .
c("nombre_archivo.csv", "nombre_archivocsv") %>% str_view(pattern = ".csv")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Coincidencias básicas

Diferenciación entre el metacaracter . y el caracter .

Ahora incluyamos \\.

c("nombre_archivo.csv", "nombre_archivocsv") %>% str_view(pattern = "\\.csv")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Coincidencias básicas

Diferenciación entre el metacaracter . y el caracter .

c("nombre_archivo.csv", "nombre_archivocsv") %>% str_view(pattern = r"(\.csv)")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Coincidencias básicas

Diferenciación entre el metacaracter \ y el caracter \

writeLines("a\\b")
## a\b
str_view(string = "a\\b", pattern = "\\\\")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Coincidencias básicas

Diferenciación entre el metacaracter \ y el caracter \

writeLines(r"(a\b)")
## a\b
str_view(string = r"(a\b)", pattern = r"(\\)")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Anclas

str_view(string = c("arándano", "banana", "pera"), pattern = "^a")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Anclas

str_view(string = c("arándano", "banana", "pera"), pattern = "a$")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Anclas

str_view(string = c("pie de manzana", "manzana", "queque de manzana"), 
         pattern = "^manzana$")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Anclas

str_view(string = c("esta", "es", "especial"), pattern = r"(\bes\b)")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Clases de caracteres y alternativas

str_view(string = "cumbre20 20", pattern = r"([^z](u|y).[ab]..\d\d\s\d)")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Repeticiones

str_view(c("gatos", "gato" , "gats", "gatoss", "gatosss"), 
         pattern = "gatos?")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Repeticiones

str_view(c("gatos", "gato" , "gats", "gatoss", "gatosss"), 
         pattern = "gatos+")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Repeticiones

str_view(c("gatos", "gato" , "gats", "gatoss", "gatosss"), 
         pattern = "gatos*")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Repeticiones

str_view(c("gatos", "gato" , "gats", "gatoss", "gatosss"), 
         pattern = "gatos{3}")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Repeticiones

str_view(c("gatos", "gato" , "gats", "gatoss", "gatosss"), 
         pattern = "gatos{1,3}")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Repeticiones

str_view(c("gatos", "gato" , "gats", "gatoss", "gatosss"), 
         pattern = "gatos{1,3}?")

Elementos básicos

Patrones, expresiones regulares y coincidencias

Agrupamiento y referencias previas

str_view(string = datos::frutas, pattern = r"((..)\1)", match = TRUE)

Herramientas

Herramientas

Detectar coincidencias

gapminder::gapminder %>% 
                    # Buscar todos los países que empicen por C o c
                    # como primer caracter y luego como segundo
                    # caracter por o
  filter(str_detect(string = country, pattern = "^[Cc]o"), 
         year == max(year))
## # A tibble: 6 x 6
##   country          continent  year lifeExp      pop gdpPercap
##   <fct>            <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Colombia         Americas   2007    72.9 44227550     7007.
## 2 Comoros          Africa     2007    65.2   710960      986.
## 3 Congo, Dem. Rep. Africa     2007    46.5 64606759      278.
## 4 Congo, Rep.      Africa     2007    55.3  3800610     3633.
## 5 Costa Rica       Americas   2007    78.8  4133884     9645.
## 6 Cote d'Ivoire    Africa     2007    48.3 18013409     1545.

Herramientas

Detectar coincidencias

gapminder %>% 
  filter(year == max(year)) %>% 
  # Número de paises en el que su nombre termina con una vocal 
  # en el último año
  summarize(pais_termina_vocal = sum(str_count(string = country, pattern = "[aeiou]$")))
## # A tibble: 1 x 1
##   pais_termina_vocal
##                <int>
## 1                 77
gapminder %>% 
  filter(year == max(year)) %>% 
  # Número de vocales que tiene el nombre de cada país en el 
  # último año
  mutate(pais_vocales = str_count(string = country, pattern = "[AaEeIiOoUu]")) %>% 
  # Escogemos los 3 primeros países cuyo nombre tiene más vocales
  # Se incluyen empates: with_ties = TRUE
  slice_max(order_by = pais_vocales, 
            n = 3,  
            with_ties = TRUE)
## # A tibble: 4 x 7
##   country                  continent  year lifeExp    pop gdpPercap pais_vocales
##   <fct>                    <fct>     <int>   <dbl>  <int>     <dbl>        <int>
## 1 Equatorial Guinea        Africa     2007    51.6 5.51e5    12154.           10
## 2 Bosnia and Herzegovina   Europe     2007    74.9 4.55e6     7446.            9
## 3 Central African Republic Africa     2007    44.7 4.37e6      706.            8
## 4 Sao Tome and Principe    Africa     2007    65.5 2.00e5     1598.            8

Herramientas

Obtener un subconjunto

gapminder::gapminder %>% 
                    # Extraer loss dos primeros caracteres de los 
                    # nombres de los países en el último año
  filter(year == max(year)) %>% 
  mutate(dos_primeros = str_extract(string = country, pattern = "^..")) %>% 
  slice(1:5) %>% 
  select(country, dos_primeros)
## # A tibble: 5 x 2
##   country     dos_primeros
##   <fct>       <chr>       
## 1 Afghanistan Af          
## 2 Albania     Al          
## 3 Algeria     Al          
## 4 Angola      An          
## 5 Argentina   Ar

Herramientas

Transformar una cadena de caracteres

Herramientas

Transformar una cadena de caracteres

gapminder::gapminder %>% 
  filter(year == max(year)) %>%
                   # cambiar mayúsculas por minúsculas   
  mutate(country = str_to_lower(country),
                   # eliminar cualquier caracter diferente
                   # a letras minúscula
                   ## Por ejemplo . ' o , 
         country = str_replace_all(string  = country, 
                                   pattern = "[^a-z ]", 
                                   replacement = "")) %>% 
  # mostrar ultimas 5 filas
  slice_tail(n = 5)
## # A tibble: 5 x 6
##   country            continent  year lifeExp      pop gdpPercap
##   <chr>              <fct>     <int>   <dbl>    <int>     <dbl>
## 1 vietnam            Asia       2007    74.2 85262356     2442.
## 2 west bank and gaza Asia       2007    73.4  4018332     3025.
## 3 yemen rep          Asia       2007    62.7 22211743     2281.
## 4 zambia             Africa     2007    42.4 11746035     1271.
## 5 zimbabwe           Africa     2007    43.5 12311143      470.

Herramientas

Unir o dividir una cadena de caracteres

Unir una cadena de caracteres

set.seed(123)
data <- gapminder::gapminder %>% 
  filter(year == max(year)) %>% 
  slice_sample(n = 10) %>% 
  mutate(label_text = str_glue("País: {country}
                               Año: {year}
                               PIB per-capita: {round(gdpPercap)}
                               Esperanza de vida: {lifeExp}")) %>% 
  select(country, year, lifeExp, gdpPercap, label_text)

data
## # A tibble: 10 x 5
##    country     year lifeExp gdpPercap label_text                                
##    <fct>      <int>   <dbl>     <dbl> <glue>                                    
##  1 Botswana    2007    50.7    12570. "País: Botswana\nAño: 2007\nPIB per-capit…
##  2 Greece      2007    79.5    27538. "País: Greece\nAño: 2007\nPIB per-capita:…
##  3 South Afr…  2007    49.3     9270. "País: South Africa\nAño: 2007\nPIB per-c…
##  4 Ethiopia    2007    52.9      691. "País: Ethiopia\nAño: 2007\nPIB per-capit…
##  5 Zimbabwe    2007    43.5      470. "País: Zimbabwe\nAño: 2007\nPIB per-capit…
##  6 Yemen, Re…  2007    62.7     2281. "País: Yemen, Rep.\nAño: 2007\nPIB per-ca…
##  7 Nepal       2007    63.8     1091. "País: Nepal\nAño: 2007\nPIB per-capita: …
##  8 Netherlan…  2007    79.8    36798. "País: Netherlands\nAño: 2007\nPIB per-ca…
##  9 United St…  2007    78.2    42952. "País: United States\nAño: 2007\nPIB per-…
## 10 New Zeala…  2007    80.2    25185. "País: New Zealand\nAño: 2007\nPIB per-ca…

Herramientas

Unir o dividir una cadena de caracteres

Unir una cadena de caracteres

g <- data %>% 
  ggplot(aes(gdpPercap, lifeExp)) +
  geom_point(aes(text = label_text))

ggplotly(p = g, tooltip = "text")

Herramientas

Unir o dividir una cadena de caracteres

Dividir una cadena de caracteres

"Quiero separar esta frase en cada una de sus palabras" %>% 
  # Podemos realizar análisis de texto de una 
  # manera "tidy"
  str_split(pattern = " ", 
            n = Inf) %>% 
  enframe(name = "id_oracion", value = "palabras") %>% 
  unnest(cols = palabras)
## # A tibble: 10 x 2
##    id_oracion palabras
##         <int> <chr>   
##  1          1 Quiero  
##  2          1 separar 
##  3          1 esta    
##  4          1 frase   
##  5          1 en      
##  6          1 cada    
##  7          1 una     
##  8          1 de      
##  9          1 sus     
## 10          1 palabras

stringi

Referencias

Grolemund, Garrett, and Hadley Wickham. 2019. R Para Ciencia de Datos. http://es.r4ds.hadley.nz/.